layui.define(['jquery'], function (exports) {
    const {jquery: $} = layui;
    exports('alg', {
        cartesian: function (options) {
            options = $.extend(true, {
                origin: {},
                //初始化对象
                default: {}
            }, options);

            //先放一个默认值在里面（后续会被一直分裂到最终结果）
            var result = [JSON.parse(JSON.stringify(options.default))];

            const origin = options.origin;

            //第一层 遍历属性名
            Object.keys(origin).forEach(function (key) {
                var items = origin[key];
                // console.log({key, items});

                //第二层遍历已有的SKU记录结果(倒序遍历，每次遍历都需要往后添加，正序遍历会覆盖已有的值导致出现问题)
                var resultCopy = JSON.parse(JSON.stringify(result));
                for (let i = resultCopy.length - 1; i >= 0; i--) {
                    //第三层遍历规格子属性
                    for (let j = 0; j < items.length; j++) {

                        /**
                         * 假设SKU 有两个规格，第一个规格有2个属性，第二个规格有3个属性，则SKU数量为2x3=6个，
                         * 算法实现，遍历SKU规格，
                         * 首先碰到第一个规格有2个属性，则创建两条SKU记录，
                         * 然后碰到第二个规格3个属性，这时将原有的2条SKU记录每个复制3分，组成6个，再将规格属性遍历循环式（从第一个开始放到最后一个再重第一个开始，一直到结束）放入SKU记录中。
                         * 以此类推
                         *
                         * 倒序遍历，每轮执行都会计算索引根据公式计算出要添加的值的索引，正序会覆盖待处理的值
                         */

                            // let index = i===0 ?j :(i * items.length) + j;
                        let index = (i * items.length) + j;
                        // console.log({
                        //     index,
                        //     i,
                        //     j
                        // });

                        // console.log('index', index);
                        resultCopy[index] = JSON.parse(JSON.stringify(resultCopy[i]));
                        resultCopy[index][key] = items[j];
                        // console.log(JSON.stringify(resultCopy));
                    }
                }

                result = JSON.parse(JSON.stringify(resultCopy));
            });

            return result;
        },
    });
});